WebGLã¡ãã·ã¥ã·ã§ãŒããŒã®ãã¯ãŒãšæè»æ§ãæ¢æ±ããŸãããããžãªã¡ããªåŠçã«é©åœããããããã®é«åºŠãªæ©èœã§ãWebã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããèŠäºãªèŠèŠå¹æãå®çŸããŸãã
WebGLã¡ãã·ã¥ã·ã§ãŒããŒïŒçŸä»£ã°ã©ãã£ãã¯ã¹ã®ããã®æè»ãªãžãªã¡ããªåŠçãã€ãã©ã€ã³
WebGLã¯ããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã§å¯èœãªããšã®éçãåžžã«æŒãåºãããŸããŸãé«åºŠãªã¬ã³ããªã³ã°æè¡ããã©ãŠã¶ã«ãããããŠããŸãããè¿å¹Žã§æãéèŠãªé²æ©ã®äžã€ãã¡ãã·ã¥ã·ã§ãŒããŒã§ãããã®æè¡ã¯ããžãªã¡ããªã®åŠçæ¹æ³ã«ããããã©ãã€ã ã·ãããæå³ããéçºè ã«ã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã«å¯ŸããåäŸã®ãªãå¶åŸ¡ãšæè»æ§ãæäŸããŸãããã®ããã°èšäºã§ã¯ãWebGLã¡ãã·ã¥ã·ã§ãŒããŒã®å æ¬çãªæŠèŠãæäŸãããã®æ©èœãå©ç¹ããããŠèŠäºã§æé©åããããŠã§ãã°ã©ãã£ãã¯ã¹ãäœæããããã®å®çšçãªã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠæ¢ããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒãšã¯ïŒ
åŸæ¥ãWebGLïŒããã³OpenGLïŒã®ãžãªã¡ããªåŠçãã€ãã©ã€ã³ã¯ãé ç¹ã·ã§ãŒããŒãããã»ã¬ãŒã·ã§ã³ã·ã§ãŒããŒïŒãªãã·ã§ã³ïŒããžãªã¡ããªã·ã§ãŒããŒïŒããããªãã·ã§ã³ïŒãšãã£ãåºå®æ©èœã¹ããŒãžã«äŸåããŠããŸããããããã¯åŒ·åã§ãããç¹å®ã®ã·ããªãªãç¹ã«è€éãªãžãªã¡ããªãã«ã¹ã¿ã ã¬ã³ããªã³ã°ã¢ã«ãŽãªãºã ãæ±ãå Žåã«ã¯ãå¶éããããŸãããã¡ãã·ã¥ã·ã§ãŒããŒã¯ãæ°ãããããããã°ã©ããã«ã§ãæœåšçã«ããå¹ççãªã¢ãããŒããå°å ¥ããŸãã
åã ã®é ç¹ãåŠçãã代ããã«ãã¡ãã·ã¥ã·ã§ãŒããŒã¯ã¡ãã·ã¥ïŒ3Dãªããžã§ã¯ããå®çŸ©ããé ç¹ãšããªããã£ãïŒäžè§åœ¢ãç·ãç¹ïŒã®éåïŒãæäœããŸããããã«ãããã·ã§ãŒããŒããã°ã©ã ãã¡ãã·ã¥ã®æ§é ãšå±æ§ãã°ããŒãã«ã«ææ¡ã§ããããã«ãªããé«åºŠãªã¢ã«ãŽãªãºã ãã·ã§ãŒããŒå ã§çŽæ¥å®è£ ããããšãå¯èœã«ãªããŸãã
å ·äœçã«ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒãã€ãã©ã€ã³ã¯2ã€ã®æ°ããã·ã§ãŒããŒã¹ããŒãžã§æ§æãããŸãïŒ
- ã¿ã¹ã¯ã·ã§ãŒããŒïŒãªãã·ã§ã³ïŒïŒ ã¿ã¹ã¯ã·ã§ãŒããŒã¯ãèµ·åããã¡ãã·ã¥ã·ã§ãŒããŒã®ã¯ãŒã¯ã°ã«ãŒãæ°ã決å®ãã圹å²ãæ ããŸããããã¯ããžãªã¡ããªã®ç²èŠçãªã«ãªã³ã°ãå¢å¹ ã«äœ¿çšãããŸããã¡ãã·ã¥ã·ã§ãŒããŒã®åã«å®è¡ãããã·ãŒã³ã®å¯èŠæ§ããã®ä»ã®åºæºã«åºã¥ããŠåçã«äœæ¥ãåå²ããæ¹æ³ã決å®ã§ããŸããã©ã®ããŒã ïŒã¡ãã·ã¥ã·ã§ãŒããŒïŒãã©ã®ã¿ã¹ã¯ã«åãçµãå¿ èŠãããããæ±ºå®ãããããŒãžã£ãŒã®ãããªãã®ã ãšèããŠãã ããã
- ã¡ãã·ã¥ã·ã§ãŒããŒïŒå¿ é ïŒïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãäžå¿çãªãžãªã¡ããªåŠçãè¡ãããå Žæã§ããã¯ãŒã¯ã°ã«ãŒãIDãåãåããæçµçãªã¡ãã·ã¥ããŒã¿ã®äžéšãçæãã責任ããããŸããããã«ã¯ãé ç¹ã®äœçœ®ãæ³ç·ããã¯ã¹ãã£åº§æšãäžè§åœ¢ã®ã€ã³ããã¯ã¹ãªã©ãå«ãŸããŸããå®è³ªçã«ãé ç¹ã·ã§ãŒããŒãšãžãªã¡ããªã·ã§ãŒããŒã®æ©èœã眮ãæããããã«ã¹ã¿ãã€ãºãããåŠçãå¯èœã«ããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã®ä»çµã¿ïŒè©³çŽ°è§£èª¬
ã¡ãã·ã¥ã·ã§ãŒããŒãã€ãã©ã€ã³ãã¹ããããã€ã¹ãããã§èŠãŠãããŸãããïŒ
- å ¥åããŒã¿ïŒ ã¡ãã·ã¥ã·ã§ãŒããŒãã€ãã©ã€ã³ãžã®å ¥åã¯ãéåžžãã¡ãã·ã¥ã衚ãããŒã¿ã®ãããã¡ã§ãããã®ãããã¡ã«ã¯ãé ç¹å±æ§ïŒäœçœ®ãæ³ç·ãªã©ïŒãšãå Žåã«ãã£ãŠã¯ã€ã³ããã¯ã¹ããŒã¿ãå«ãŸããŸãã
- ã¿ã¹ã¯ã·ã§ãŒããŒïŒãªãã·ã§ã³ïŒïŒ ååšããå Žåãã¿ã¹ã¯ã·ã§ãŒããŒãæåã«å®è¡ãããŸããå ¥åããŒã¿ãåæããã¡ãã·ã¥ãåŠçããããã«å¿ èŠãªã¡ãã·ã¥ã·ã§ãŒããŒã®ã¯ãŒã¯ã°ã«ãŒãæ°ã決å®ããŸãããããŠãèµ·åããã¯ãŒã¯ã°ã«ãŒãæ°ãåºåããŸããã°ããŒãã«ãªã·ãŒã³ãããŒãžã£ãŒã¯ããã®ã¹ããŒãžã䜿çšããŠè©³çްã¬ãã«ïŒLODïŒã決å®ããããšããããŸãã
- ã¡ãã·ã¥ã·ã§ãŒããŒã®å®è¡ïŒ ã¿ã¹ã¯ã·ã§ãŒããŒã«ãã£ãŠæ±ºå®ãããïŒãŸãã¯ã¿ã¹ã¯ã·ã§ãŒããŒããªãå Žåã¯ãã£ã¹ãããã³ãŒã«ã«ãã£ãŠæ±ºå®ãããïŒåã¯ãŒã¯ã°ã«ãŒãã«å¯ŸããŠã¡ãã·ã¥ã·ã§ãŒããŒãèµ·åãããŸããåã¯ãŒã¯ã°ã«ãŒãã¯ç¬ç«ããŠåäœããŸãã
- ã¡ãã·ã¥çæïŒ ã¡ãã·ã¥ã·ã§ãŒããŒå ã§ãã¹ã¬ããã¯ååããŠæçµçãªã¡ãã·ã¥ããŒã¿ã®äžéšãçæããŸããå ¥åãããã¡ããããŒã¿ãèªã¿åããèšç®ãå®è¡ããçµæã®é ç¹ãšäžè§åœ¢ã®ã€ã³ããã¯ã¹ãå ±æã¡ã¢ãªã«æžã蟌ã¿ãŸãã
- åºåïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãäžé£ã®é ç¹ãšããªããã£ããããªãã¡ãã·ã¥ãåºåããŸãããã®ããŒã¿ã¯ããã®åŸã¬ã³ããªã³ã°ã®ããã«ã©ã¹ã¿ã©ã€ãŒãŒã·ã§ã³ã¹ããŒãžã«æž¡ãããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããå©ç¹
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãåŸæ¥ã®ãžãªã¡ããªåŠçæè¡ã«æ¯ã¹ãŠããã€ãã®éèŠãªå©ç¹ãæäŸããŸãïŒ
- æè»æ§ã®åäžïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãã¯ããã«ããã°ã©ããã«ãªãã€ãã©ã€ã³ãæäŸããŸããéçºè ã¯ãžãªã¡ããªã®åŠçæ¹æ³ãå®å šã«å¶åŸ¡ã§ããåŸæ¥ã®ã·ã§ãŒããŒã§ã¯äžå¯èœãŸãã¯éå¹çãªã«ã¹ã¿ã ã¢ã«ãŽãªãºã ãå®è£ ã§ããŸããã«ã¹ã¿ã ã®é ç¹å§çž®ãããã·ãŒãžã£ã«çæãã·ã§ãŒããŒå ã§çŽæ¥ç°¡åã«å®è£ ããããšãæ³åããŠã¿ãŠãã ããã
- ããã©ãŒãã³ã¹ã®åäžïŒ å€ãã®å Žåãã¡ãã·ã¥ã·ã§ãŒããŒã¯å€§å¹ ãªããã©ãŒãã³ã¹åäžã«ã€ãªãããŸããã¡ãã·ã¥å šäœãæäœããããšã§ããããŒã³ãŒã«ã®æ°ãæžãããCPUãšGPUéã®ããŒã¿è»¢éãæå°éã«æããããšãã§ããŸããã¿ã¹ã¯ã·ã§ãŒããŒã«ãããã€ã³ããªãžã§ã³ããªã«ãªã³ã°ãšLODéžæãå¯èœã«ãªããããã©ãŒãã³ã¹ãããã«æé©åãããŸãã
- ãã€ãã©ã€ã³ã®ç°¡çŽ åïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãè€æ°ã®ã·ã§ãŒããŒã¹ããŒãžãåäžã®ãã管çãããããŠãããã«çµ±åããããšã§ãã¬ã³ããªã³ã°ãã€ãã©ã€ã³å šäœãç°¡çŽ åã§ããŸããããã«ãããã³ãŒããçè§£ãããããä¿å®ãããããªããŸããåäžã®ã¡ãã·ã¥ã·ã§ãŒããŒããé ç¹ã·ã§ãŒããŒãšãžãªã¡ããªã·ã§ãŒããŒã眮ãæããããšãã§ããŸãã
- åç詳现ã¬ãã«ïŒLODïŒïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã«ãããåçãªLODæè¡ã®å®è£ ã容æã«ãªããŸããã¿ã¹ã¯ã·ã§ãŒããŒã¯ã«ã¡ã©ãŸã§ã®è·é¢ãåæããã¬ã³ããªã³ã°ãããã¡ãã·ã¥ã®è€éããåçã«èª¿æŽã§ããŸããé ãã«ãã建ç©ã¯äžè§åœ¢ãéåžžã«å°ãªããè¿ãã«ãã建ç©ã¯å€ããªããããããŸããã
- ããã·ãŒãžã£ã«ãªãžãªã¡ããªçæïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ããžãªã¡ããªãããã·ãŒãžã£ã«ã«çæããã®ã«åªããŠããŸããã·ã§ãŒããŒå ã§æ°åŠé¢æ°ãå®çŸ©ããŠãè€éãªåœ¢ç¶ããã¿ãŒã³ããã®å Žã§äœæã§ããŸãã詳现ãªå°åœ¢ãè€éãªãã©ã¯ã¿ã«æ§é ãGPUäžã§çŽæ¥çæããããšãèããŠã¿ãŠãã ããã
ã¡ãã·ã¥ã·ã§ãŒããŒã®å®çšçãªå¿çš
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ã以äžã®ãããªå¹ åºãã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãïŒ
- 髿§èœã¬ã³ããªã³ã°ïŒ é«ããã¬ãŒã ã¬ãŒããå¿ èŠãšããã²ãŒã ããã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã¡ãã·ã¥ã·ã§ãŒããŒãæäŸããããã©ãŒãã³ã¹æé©åã®æ©æµãåããããšãã§ããŸããäŸãã°ã倧人æ°ã®çŸ€è¡ã詳现ãªç°å¢ã®ã¬ã³ããªã³ã°ãããå¹ççã«ãªããŸãã
- ããã·ãŒãžã£ã«çæïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ã颚æ¯ãéœåžãããŒãã£ã¯ã«ãšãã§ã¯ããªã©ãããã·ãŒãžã£ã«ã«çæãããã³ã³ãã³ãã®äœæã«çæ³çã§ããããã¯ãã³ã³ãã³ãããã®å Žã§çæããå¿ èŠãããã²ãŒã ãã·ãã¥ã¬ãŒã·ã§ã³ãããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ã§äŸ¡å€ããããŸãã建ç©ã®é«ããå»ºç¯æ§åŒãéãã®ã¬ã€ã¢ãŠããç°ãªãéœåžãèªåçã«çæãããããšãæ³åããŠã¿ãŠãã ããã
- é«åºŠãªèŠèŠå¹æïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã«ãããéçºè ã¯ã¢ãŒãã£ã³ã°ãç²ç ãããŒãã£ã¯ã«ã·ã¹ãã ãªã©ã®æŽç·ŽãããèŠèŠå¹æããããåªããå¶åŸ¡ãšå¹çã§å®è£ ã§ããŸãã
- ç§åŠçèŠèŠåïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãæµäœååŠã·ãã¥ã¬ãŒã·ã§ã³ãååæ§é ãªã©ã®è€éãªç§åŠããŒã¿ãé«å¿ å®åºŠã§èŠèŠåããããã«äœ¿çšã§ããŸãã
- CAD/CAMã¢ããªã±ãŒã·ã§ã³ïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãè€éãª3Dã¢ãã«ã®å¹ççãªã¬ã³ããªã³ã°ãå¯èœã«ããããšã§ãCAD/CAMã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
WebGLã§ã®ã¡ãã·ã¥ã·ã§ãŒããŒã®å®è£
æ®å¿µãªãããã¡ãã·ã¥ã·ã§ãŒããŒã«å¯ŸããWebGLã®ãµããŒãã¯ãŸã æ®éçã«å©çšå¯èœã§ã¯ãããŸãããã¡ãã·ã¥ã·ã§ãŒããŒã¯æ¯èŒçæ°ããæ©èœã§ããããã®å©çšå¯èœæ§ã¯äœ¿çšãããŠããç¹å®ã®ãã©ãŠã¶ãšã°ã©ãã£ãã¯ã«ãŒãã«äŸåããŸãããããã¯éåžžãæ¡åŒµæ©èœãå ·äœçã«ã¯ `GL_NV_mesh_shader` (Nvidia) ããã³ `GL_EXT_mesh_shader` (ãžã§ããªãã¯) ãéããŠã¢ã¯ã»ã¹ã§ããŸããã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããåã«ãå¿ ãæ¡åŒµæ©èœã®ãµããŒãã確èªããŠãã ããã
以äžã¯ãWebGLã§ã¡ãã·ã¥ã·ã§ãŒããŒãå®è£ ããéã®äžè¬çãªæé ã®æŠèŠã§ãïŒ
- æ¡åŒµæ©èœã®ãµããŒãã確èªïŒ `gl.getExtension()` ã䜿çšããŠããã©ãŠã¶ã `GL_NV_mesh_shader` ãŸã㯠`GL_EXT_mesh_shader` æ¡åŒµæ©èœããµããŒãããŠãããã確èªããŸãã
- ã·ã§ãŒããŒã®äœæïŒ `gl.createShader()` ãš `gl.shaderSource()` ã䜿çšããŠãã¿ã¹ã¯ã·ã§ãŒããŒïŒå¿ èŠãªå ŽåïŒãšã¡ãã·ã¥ã·ã§ãŒããŒããã°ã©ã ãäœæããŸãããããã®ã·ã§ãŒããŒã®ããã®GLSLã³ãŒããèšè¿°ããå¿ èŠããããŸãã
- ã·ã§ãŒããŒã®ã³ã³ãã€ã«ïŒ `gl.compileShader()` ã䜿çšããŠã·ã§ãŒããŒãã³ã³ãã€ã«ããŸãã`gl.getShaderParameter()` ãš `gl.getShaderInfoLog()` ã䜿çšããŠã³ã³ãã€ã«ãšã©ãŒã確èªããŸãã
- ããã°ã©ã ã®äœæïŒ `gl.createProgram()` ã䜿çšããŠã·ã§ãŒããŒããã°ã©ã ãäœæããŸãã
- ã·ã§ãŒããŒã®ã¢ã¿ããïŒ `gl.attachShader()` ã䜿çšããŠãã¿ã¹ã¯ã·ã§ãŒããŒãšã¡ãã·ã¥ã·ã§ãŒããŒãããã°ã©ã ã«ã¢ã¿ããããŸããé ç¹ã·ã§ãŒããŒããžãªã¡ããªã·ã§ãŒããŒã¯ã¢ã¿ãã*ããªã*ããšã«æ³šæããŠãã ããã
- ããã°ã©ã ã®ãªã³ã¯ïŒ `gl.linkProgram()` ã䜿çšããŠã·ã§ãŒããŒããã°ã©ã ããªã³ã¯ããŸãã`gl.getProgramParameter()` ãš `gl.getProgramInfoLog()` ã䜿çšããŠãªã³ã¯ãšã©ãŒã確èªããŸãã
- ããã°ã©ã ã®äœ¿çšïŒ `gl.useProgram()` ã䜿çšããŠã·ã§ãŒããŒããã°ã©ã ã䜿çšããŸãã
- ã¡ãã·ã¥ã®ãã£ã¹ãããïŒ `gl.dispatchMeshNV()` ãŸã㯠`gl.dispatchMeshEXT()` ã䜿çšããŠã¡ãã·ã¥ã·ã§ãŒããŒããã£ã¹ãããããŸãããã®é¢æ°ã¯ãå®è¡ããã¯ãŒã¯ã°ã«ãŒãã®æ°ãæå®ããŸããã¿ã¹ã¯ã·ã§ãŒããŒã䜿çšãããå Žåãã¯ãŒã¯ã°ã«ãŒãæ°ã¯ã¿ã¹ã¯ã·ã§ãŒããŒã®åºåã«ãã£ãŠæ±ºå®ãããŸãã
GLSLã³ãŒãäŸïŒã¡ãã·ã¥ã·ã§ãŒããŒïŒ
ããã¯ç°¡ç¥åãããäŸã§ããå®éã®ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«åãããŠå€§å¹ ã«è€éã«ãªããŸãã
#version 450 core
#extension GL_NV_mesh_shader : require
layout(local_size_x = 32) in;
layout(triangles, max_vertices = 32, max_primitives = 16) out;
layout(location = 0) out vec3 mesh_position[];
void main() {
uint id = gl_LocalInvocationID.x;
uint num_vertices = gl_NumWorkGroupInvocation;
if (id < 3) {
gl_MeshVerticesNV[id].gl_Position = vec4(float(id) - 1.0, 0.0, 0.0, 1.0);
mesh_position[id] = gl_MeshVerticesNV[id].gl_Position.xyz;
}
if (id < 1) { // Only generate one triangle for simplicity
gl_MeshPrimitivesNV[0].gl_PrimitiveID = 0;
gl_MeshPrimitivesNV[0].gl_VertexIndices[0] = 0;
gl_MeshPrimitivesNV[0].gl_VertexIndices[1] = 1;
gl_MeshPrimitivesNV[0].gl_VertexIndices[2] = 2;
}
gl_NumMeshTasksNV = 1; // Only one mesh task
gl_NumMeshVerticesNV = 3; //Three vertices
gl_NumMeshPrimitivesNV = 1; // One triangle
}
解説ïŒ
- `#version 450 core`: GLSLã®ããŒãžã§ã³ãæå®ããŸããã¡ãã·ã¥ã·ã§ãŒããŒã¯éåžžãæ¯èŒçæ°ããããŒãžã§ã³ãå¿ èŠãšããŸãã
- `#extension GL_NV_mesh_shader : require`: ã¡ãã·ã¥ã·ã§ãŒããŒæ¡åŒµæ©èœãæå¹ã«ããŸãã
- `layout(local_size_x = 32) in;`: ã¯ãŒã¯ã°ã«ãŒãã®ãµã€ãºãå®çŸ©ããŸãããã®å Žåãåã¯ãŒã¯ã°ã«ãŒãã«ã¯32ã¹ã¬ãããå«ãŸããŸãã
- `layout(triangles, max_vertices = 32, max_primitives = 16) out;`: åºåã¡ãã·ã¥ã®ããããžïŒäžè§åœ¢ïŒãé ç¹ã®æå€§æ°ïŒ32ïŒãããªããã£ãã®æå€§æ°ïŒ16ïŒãæå®ããŸãã
- `gl_MeshVerticesNV[id].gl_Position = vec4(float(id) - 1.0, 0.0, 0.0, 1.0);`: é ç¹ã«äœçœ®ãå²ãåœãŠãŸãããã®äŸã§ã¯ãåçŽãªäžè§åœ¢ãäœæããŸãã
- `gl_MeshPrimitivesNV[0].gl_VertexIndices[0] = 0; ...`: äžè§åœ¢ã®ã€ã³ããã¯ã¹ãå®çŸ©ããã©ã®é ç¹ãäžè§åœ¢ã圢æããããæå®ããŸãã
- `gl_NumMeshTasksNV = 1;` & `gl_NumMeshVerticesNV = 3;` & `gl_NumMeshPrimitivesNV = 1;`: ã¡ãã·ã¥ã·ã§ãŒããŒã«ãã£ãŠçæãããã¡ãã·ã¥ã¿ã¹ã¯ã®æ°ãé ç¹ã®æ°ãããªããã£ãã®æ°ãæå®ããŸãã
GLSLã³ãŒãäŸïŒã¿ã¹ã¯ã·ã§ãŒã㌠- ãªãã·ã§ã³ïŒ
#version 450 core
#extension GL_NV_mesh_shader : require
layout(local_size_x = 1) in;
layout(max_mesh_workgroups = 1) out;
void main() {
// Simple example: always dispatch one mesh workgroup
gl_MeshWorkGroupCountNV[0] = 1; // Dispatch one mesh workgroup
}
解説ïŒ
- `layout(local_size_x = 1) in;`: ã¯ãŒã¯ã°ã«ãŒãã®ãµã€ãºãå®çŸ©ããŸãããã®å Žåãåã¯ãŒã¯ã°ã«ãŒãã«ã¯1ã¹ã¬ãããå«ãŸããŸãã
- `layout(max_mesh_workgroups = 1) out;`: ãã®ã¿ã¹ã¯ã·ã§ãŒããŒã«ãã£ãŠãã£ã¹ããããããã¡ãã·ã¥ã¯ãŒã¯ã°ã«ãŒãã®æ°ã1ã«å¶éããŸãã
- `gl_MeshWorkGroupCountNV[0] = 1;`: ã¡ãã·ã¥ã¯ãŒã¯ã°ã«ãŒãã®æ°ã1ã«èšå®ããŸããããè€éãªã·ã§ãŒããŒã§ã¯ãã·ãŒã³ã®è€éããä»ã®èŠå ã«åºã¥ããŠæé©ãªã¯ãŒã¯ã°ã«ãŒãæ°ã決å®ããããã«èšç®ã䜿çšããå ŽåããããŸãã
éèŠãªèæ ®äºé ïŒ
- GLSLããŒãžã§ã³ïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãå€ãã®å ŽåGLSL 4.50以éãå¿ èŠãšããŸãã
- æ¡åŒµæ©èœã®å©çšå¯èœæ§ïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããåã«ãåžžã« `GL_NV_mesh_shader` ãŸã㯠`GL_EXT_mesh_shader` æ¡åŒµæ©èœã確èªããŠãã ããã
- åºåã¬ã€ã¢ãŠãïŒ é ç¹å±æ§ãšããªããã£ãããããžãæå®ããŠãã¡ãã·ã¥ã·ã§ãŒããŒã®åºåã¬ã€ã¢ãŠããæ éã«å®çŸ©ããŠãã ããã
- ã¯ãŒã¯ã°ã«ãŒããµã€ãºïŒ ããã©ãŒãã³ã¹ãæé©åããããã«ãã¯ãŒã¯ã°ã«ãŒããµã€ãºã¯æ éã«éžæããå¿ èŠããããŸãã
- ãããã°ïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã®ãããã°ã¯å°é£ãªå ŽåããããŸããã°ã©ãã£ãã¯ã¹ãã©ã€ãããã©ãŠã¶ã®éçºè ããŒã«ãæäŸãããããã°ããŒã«ã䜿çšããŠãã ããã
課é¡ãšèæ ®äºé
ã¡ãã·ã¥ã·ã§ãŒããŒã¯å€§ããªå©ç¹ãæäŸããŸãããçæãã¹ãããã€ãã®èª²é¡ãšèæ ®äºé ããããŸãïŒ
- æ¡åŒµæ©èœãžã®äŸåïŒ WebGLã§ã®æ®éçãªãµããŒãã®æ¬ åŠã倧ããªéå£ã§ããéçºè ã¯ãå¿ èŠãªæ¡åŒµæ©èœããµããŒãããŠããªããã©ãŠã¶ã®ããã«ãã©ãŒã«ããã¯ã¡ã«ããºã ãæäŸããå¿ èŠããããŸãã
- è€éãïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãåŸæ¥ã®ã·ã§ãŒããŒãããå®è£ ãè€éã«ãªãå¯èœæ§ããããã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã®ããæ·±ãçè§£ãå¿ èŠã§ãã
- ãããã°ïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã¯ããã®äžŠåçãªæ§è³ªãšå©çšå¯èœãªãããã°ããŒã«ã®å¶éã«ããããããã°ãããå°é£ã«ãªãããšããããŸãã
- ç§»æ€æ§ïŒ `GL_NV_mesh_shader` çšã«æžãããã³ãŒãã¯ã`GL_EXT_mesh_shader` ã§åäœãããããã«èª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãããåºæ¬çãªæŠå¿µã¯åãã§ãã
- åŠç¿æ²ç·ïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã广çã«æŽ»çšããæ¹æ³ãçè§£ããã«ã¯ãç¹ã«åŸæ¥ã®ã·ã§ãŒããŒããã°ã©ãã³ã°ã«æ £ããŠããéçºè ã«ãšã£ãŠã¯åŠç¿æ²ç·ãååšããŸãã
ã¡ãã·ã¥ã·ã§ãŒããŒã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
ã¡ãã·ã¥ã·ã§ãŒããŒã®å©ç¹ãæå€§åããäžè¬çãªèœãšã穎ãé¿ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- å°ããå§ããïŒ ããè€éãªãããžã§ã¯ãã«åãçµãåã«ãã¡ãã·ã¥ã·ã§ãŒããŒã®åºæ¬æŠå¿µãçè§£ããããã«ç°¡åãªäŸããå§ããŠãã ããã
- ãããã¡ã€ã«ãšæé©åïŒ ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«å¿ããŠã¡ãã·ã¥ã·ã§ãŒããŒã³ãŒããæé©åããŠãã ããã
- ãã©ãŒã«ããã¯ãæäŸããïŒ ã¡ãã·ã¥ã·ã§ãŒããŒããµããŒãããŠããªããã©ãŠã¶ã®ããã«ãã©ãŒã«ããã¯ã¡ã«ããºã ãå®è£ ããŠãã ãããããã«ã¯ãåŸæ¥ã®ã·ã§ãŒããŒã䜿çšããããã·ãŒã³ãç°¡çŽ åããããšãå«ãŸããŸãã
- ããŒãžã§ã³ç®¡çã䜿çšããïŒ ããŒãžã§ã³ç®¡çã·ã¹ãã ã䜿çšããŠã¡ãã·ã¥ã·ã§ãŒããŒã³ãŒãã®å€æŽã远跡ããå¿ èŠã«å¿ããŠä»¥åã®ããŒãžã§ã³ã«ç°¡åã«æ»ããããã«ããŠãã ããã
- ã³ãŒããææžåããïŒ ã¡ãã·ã¥ã·ã§ãŒããŒã³ãŒããååã«ææžåããŠãçè§£ãšä¿å®ã容æã«ããŠãã ãããããã¯ç¹ã«è€éãªã·ã§ãŒããŒã§éèŠã§ãã
- æ¢åã®ãªãœãŒã¹ã掻çšããïŒ æ¢åã®äŸããã¥ãŒããªã¢ã«ã調ã¹ãŠãçµéšè±å¯ãªéçºè ããåŠã³ããã¹ããã©ã¯ãã£ã¹ã«ã€ããŠã®æŽå¯ãåŸãŠãã ãããKhronos GroupãNVIDIAãæçšãªããã¥ã¡ã³ããæäŸããŠããŸãã
WebGLãšã¡ãã·ã¥ã·ã§ãŒããŒã®æªæ¥
ã¡ãã·ã¥ã·ã§ãŒããŒã¯ãWebGLã®é²åã«ãããéèŠãªäžæ©ã衚ããŠããŸããããŒããŠã§ã¢ã®ãµããŒããããåºç¯ã«ãªããWebGL仿§ãé²åããã«ã€ããŠãã¡ãã·ã¥ã·ã§ãŒããŒã¯ãŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã§ãŸããŸãæ®åããŠããããšãæåŸ ãããŸããããããæäŸããæè»æ§ãšããã©ãŒãã³ã¹ã®å©ç¹ã¯ãèŠäºã§æé©åãããèŠèŠäœéšãåµé ããããšããéçºè ã«ãšã£ãŠè²ŽéãªããŒã«ãšãªããŸãã
æªæ¥ã¯ãWebGLã®åŸç¶ã§ããWebGPUãšã®ããç·å¯ãªçµ±åãããããã§ããããWebGPUã®èšèšã¯ãçŸä»£ã®ã°ã©ãã£ãã¯ã¹APIãåãå ¥ããåæ§ã®ããã°ã©ããã«ãªãžãªã¡ããªãã€ãã©ã€ã³ã«å¯Ÿãã第äžçŽã®ãµããŒããæäŸããŠãããããã«ããç°ãªããã©ãããã©ãŒã éã§ã®ãããã®æè¡ã®ç§»è¡ãšæšæºåã容æã«ãªãå¯èœæ§ããããŸããã¡ãã·ã¥ã·ã§ãŒããŒãšå°æ¥ã®Webã°ã©ãã£ãã¯ã¹APIã®åã«ãã£ãŠãã¬ã€ãã¬ãŒã·ã³ã°ããã¹ãã¬ãŒã·ã³ã°ã®ãããªãããé«åºŠãªã¬ã³ããªã³ã°æè¡ãããã¢ã¯ã»ã¹ãããããªãããšãæåŸ ãããŸãã
çµè«
WebGLã¡ãã·ã¥ã·ã§ãŒããŒã¯ããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšèŠèŠå質ãå€§å¹ ã«åäžãããããšãã§ããã匷åã§æè»ãªãžãªã¡ããªåŠçãã€ãã©ã€ã³ãæäŸããŸãããã®æè¡ã¯ãŸã æ¯èŒçæ°ããã§ããããã®å¯èœæ§ã¯èšãç¥ããŸãããã¡ãã·ã¥ã·ã§ãŒããŒã®æŠå¿µãå©ç¹ã課é¡ãçè§£ããããšã§ãéçºè ã¯ãŠã§ãäžã§æ²¡å ¥åã§ã€ã³ã¿ã©ã¯ãã£ããªäœéšãåµé ããããã®æ°ããå¯èœæ§ãåãéãããšãã§ããŸããããŒããŠã§ã¢ã®ãµããŒããšWebGLæšæºãé²åããã«ã€ããŠãã¡ãã·ã¥ã·ã§ãŒããŒã¯ãŠã§ãã°ã©ãã£ãã¯ã¹ã®éçãæŒãäžããããã®äžå¯æ¬ ãªããŒã«ãšãªãã§ãããã